const express = require("express");

const app = express();

/**
 * 中间件：就是匹配路由之前和匹配路由之后做的一系列的操作
 * 中间件可以用来做权限判断：没有登陆  跳转到登录页面，登陆以后就显示登陆以后的页面
 * Express 应用可以使用如下几种中间件：
 * 1. 应用级中间件：绑定到 app 对象上，所有的请求都会经过这个中间件（用于权限判断）。
 * 2. 路由级中间件：绑定到特定的路由上，只对特定的路由起作用（用的比较少）。
 * 3. 错误处理中间件：用于处理错误的中间件。
 * 4. 内置中间件：Express 提供的一些内置中间件，如 express.json()、express.urlencoded() 等。
 * 5. 第三方中间件：可以使用 npm 安装的第三方中间件，如 body-parser、cookie-parser 等。
 */

// 4. 内置中间件
app.use(express.static("static")); // 提供静态文件服务，访问 static 目录下的静态资源

// 1. 应用级中间件（用于权限判断） 所有的请求都会经过这个中间件，这个中间件可以用来记录请求的日志、处理请求体等
app.use((req, res, next) => {
    console.log(`${req.method} ${req.url}`);
    console.log(`请求时间: ${new Date().toLocaleString()}`);
    next(); // 调用下一个中间件或路由处理函数
});

app.get("/", (req, res) => {
    res.send("Hello, World!");
});

app.get("/login", (req, res) => {
    res.send("登录页面");
});

// 2. 路由级中间件（使用得比较少） 只对特定的路由起作用
app.get("/news/add", (req, res, next) => {
    // res.send("执行增加新闻");
    console.log("执行增加新闻路由的中间件");
    next(); // 调用下一个中间件或路由处理函数
});

app.get("/news/:id", (req, res) => {
    res.send("新闻动态路由" + req.params.id);
});

// 3. 错误处理中间件
app.use((req, res, next) => {
    res.status(404).send("404 Not Found");
});

app.listen(3000, () => {
    console.log("Server is running on http://localhost:3000");
});